package com.allwees.bs.c.module.order.service;

import com.allwees.bs.c.module.order.constant.EOrderQueryType;
import com.allwees.bs.c.module.order.dto.LiveOrderDTO;
import com.allwees.bs.c.module.order.dto.OrderDTO;
import com.allwees.bs.c.module.order.dto.OrderItemDTO;
import com.allwees.bs.c.module.order.dto.TrackingDetailDTO;
import com.allwees.bs.c.module.order.entity.OrderEntity;
import com.allwees.bs.c.module.order.req.OrderCancelReq;
import com.allwees.bs.c.module.order.req.OrderReviewReq;
import com.allwees.bs.core.model.payment.enums.EPaymentType;
import com.allwees.bs.core.modelbase.page.PageParams;
import com.allwees.bs.core.modelbase.page.PaginateDTO;
import org.springframework.transaction.annotation.Transactional;

public interface IOrderService {

	/**
	 * 获取指定用户订单列表
	 *
	 * @param userUuid
	 *            用户ID
	 * @param queryType
	 *            订单查询类型
	 * @param pageParams
	 *            翻页参数
	 * @return 订单翻页数据传输对象
	 */
	PaginateDTO<OrderDTO> fetchUserOrders(String userUuid, EOrderQueryType queryType, Integer type, PageParams pageParams);

	/**
	 * 获取订单详情
	 *
	 * @param userUuid
	 *            用户ID
	 * @param orderUuid
	 *            订单ID
	 * @return 订单详情数据
	 */
	OrderDTO fetchUserOrder(String userUuid, String orderUuid);

	/**
	 * 查询物流信息
	 *
	 * @param userUuid
	 * @param trackingNumber
	 * @return
	 */
	 TrackingDetailDTO queryTrackingDetail(String userUuid,String trackingNumber);

    @Transactional
    OrderDTO userConfirmShippingOrder(String userUuid, String orderItemUuid);

    /**
	 * 用户取消订单，在支付前可使用
	 *
	 * @param userUuid
	 *            用户ID
	 * @param orderUuid
	 *            订单ID
	 * @param req
	 *            取消订单的原因，备注信息
	 * @return 订单详情
	 */
	OrderDTO userCancelOrder(String userUuid, String orderUuid, OrderCancelReq req);

	/**
	 * COD订单，直接跳过付款，同步订单至OMS
	 * @param order
	 * @return
	 */
	OrderDTO payOrderByCOD(OrderEntity order);

	/**
	 * 评价订单
	 *
	 * @param userUuid
	 *            用户ID
	 * @param orderReviewReq
	 *            订单项及评价信息
	 * @return 订单信息
	 */
	OrderItemDTO reviewOrderItem(String userUuid, OrderReviewReq orderReviewReq);

	/**
	 * 支付订单，内部方法，支付部分调用，当支付完成后，调用该方法通知修改订单状态
	 * @param orderUuid
	 * @param paymentUuid
	 * @return
	 */
	OrderDTO payOrder(String orderUuid, String paymentUuid, EPaymentType paymentType);

	/**
	 * 订单明细详情
	 * @param userUuid
	 * @param orderUuid
	 * @param orderItemUuid
	 */
    OrderItemDTO findOrderItem(String userUuid, String orderUuid, String orderItemUuid);

	/**
	 * 直播订单
	 * @param productUuid
	 * @return
	 */
	LiveOrderDTO fetchLiveOrder(String productUuid);

	void check4UserFirstPayedOrder(OrderDTO order);

	/**
	 * 发送订单确认邮件
	 * @param orderUuid
	 */
	void sendOrderConfirmEmail(String orderUuid);

	void updateRefundChannelIdByOrderUuid(String orderUuid, String refundChannelId);
}
